/*
 * @(#)ColorFormatter.java
 * 
 * Copyright (c) 2009-2010 by the original authors of JHotDraw and all its
 * contributors. All rights reserved.
 * 
 * You may not use, copy or modify this file, except in compliance with the 
 * license agreement you entered into with the copyright holders. For details
 * see accompanying license terms.
 */
package org.jhotdraw.text;

import java.awt.Color;
import java.awt.color.ColorSpace;
import java.text.ParseException;

import org.jhotdraw.color.HSBColorSpace;
import org.jhotdraw.util.ResourceBundleUtil;

/**
 * {@code ColorFormatter} is used to format colors into a textual representation
 * which can be displayed as a tooltip.
 * <p>
 * By default, the formatter is adaptive, meaning that the format depends on the
 * {@code ColorSpace} of the current {@code Color} value.
 * <p>
 * 
 * @author Werner Randelshofer
 * @version $Id: ColorFormatter.java 632 2010-01-21 16:06:59Z rawcoder $
 */
public class ColorToolTipTextFormatter extends ColorFormatter {

	private ResourceBundleUtil labels;

	public ColorToolTipTextFormatter() {
		labels = ResourceBundleUtil.getBundle("/org/jhotdraw.draw.Labels");
	}

	@Override
	public String valueToString(Object value) throws ParseException {
		String str = null;

		if (value == null) {
			if (allowsNullValue) {
				str = "";
			} else {
				throw new ParseException("Null value is not allowed.", 0);
			}
		} else {
			if (!(value instanceof Color)) {
				throw new ParseException("Value is not a color " + value, 0);
			}

			Color c = (Color) value;

			Format f = outputFormat;

			if (isAdaptive) {
				if (c.getColorSpace().equals(HSBColorSpace.getInstance())) {
					f = Format.HSB_PERCENTAGE;
				} else if (c.getColorSpace().equals(ColorSpace.getInstance(ColorSpace.CS_GRAY))) {
					f = Format.GRAY_PERCENTAGE;
				} else {
					f = Format.RGB_INTEGER;
				}
			}
			switch (f) {
			case RGB_HEX:
				str = "000000" + Integer.toHexString(c.getRGB() & 0xffffff);
				str = labels.getFormatted("attribute.color.rgbHexComponents.toolTipText",//
						str.substring(str.length() - 6));
				break;
			case RGB_INTEGER:
				str = labels.getFormatted("attribute.color.rgbComponents.toolTipText",//
						numberFormat.format(c.getRed()),//
						numberFormat.format(c.getGreen()),//
						numberFormat.format(c.getBlue()));
				break;
			case RGB_PERCENTAGE:
				str = labels.getFormatted("attribute.color.rgbPercentageComponents.toolTipText",//
						numberFormat.format(c.getRed() / 255f),//
						numberFormat.format(c.getGreen() / 255f),//
						numberFormat.format(c.getBlue() / 255f));
				break;
			case HSB_PERCENTAGE: {
				float[] components;
				if (c.getColorSpace().equals(HSBColorSpace.getInstance())) {
					components = c.getComponents(null);
				} else {
					components = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), new float[3]);
				}
				str = labels.getFormatted("attribute.color.hsbComponents.toolTipText",//
						numberFormat.format(components[0] * 360),//
						numberFormat.format(components[1] * 100),//
						numberFormat.format(components[2] * 100));
				break;
			}
			case GRAY_PERCENTAGE: {
				float[] components;
				if (c.getColorSpace().equals(ColorSpace.getInstance(ColorSpace.CS_GRAY))) {
					components = c.getComponents(null);
				} else {
					components = c.getColorComponents(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
				}
				str = labels.getFormatted("attribute.color.grayComponents.toolTipText",//
						numberFormat.format(components[0] * 100));
				break;
			}
			}
		}
		return str;
	}
}
